iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
自我挑戰組

從零開始的AI學習之路:非本科轉職的30天挑戰記系列 第 10

D10 | Python學習心得-聽起來很可愛的泡泡排序Bubble Sort

  • 分享至 

  • xImage
  •  

還記得我第一次聽到「泡泡排序」這四個字時,腦海裡浮現的是肥皂泡泡跟珍珠奶茶的畫面。
結果打開講義一看——什麼珍珠?沒有!也沒有肥皂泡泡!
只有一堆數字在那邊跑來跑去,比較、交換、排列,最後由小排到大/images/emoticon/emoticon06.gif

「這...到底跟泡泡有什麼關係?」

直到老師解釋——這就像泡泡會浮到水面上,最大的數字也會一步一步「浮」到列表的最右邊。
原來如此!難怪會不停的交換、交換、交換...

泡泡排序的基本原理:

從數列的第一個元素開始,比較相鄰的兩個元素。
如果左邊的元素比右邊的元素大,則交換它們的位置;反之就不用交換。
對於數列中的每一對相鄰元素都進行比較和交換,直到數列的末尾。
重複以上步驟,直到整個數列都排序完成。

很神奇的是,
對於一組包含N個數字資料的數列,會是進行N-1次的比對,
比如[1, 3, 4, 2],是一組4個數字的數列,所以會比對(4-1)次,也就是3次:

https://ithelp.ithome.com.tw/upload/images/20250815/20177974xayr1hEk8Z.png

這題會需要用到雙層for迴圈,容易踩初學者的第一個坑--忘了內層迴圈的範圍是要減去外層迴圈的次數。
(因為每跑一輪,就會有一個最大值固定在右邊,不用再比。)

Python程式碼如下:

arr = [1, 3, 4, 2]   # 建立一個數列
n = len(arr)         # 計算數列長度 (4)

for i in range(n):   # 外層迴圈:總共要跑 n 輪
    print(f"第 {i+1} 輪開始:{arr}")  # 觀察是第幾輪印出的結果

    for j in range(0, n - i - 1):   # 內層迴圈:每次少比較1個已排好的元素
        print(f"  比較 {arr[j]} 和 {arr[j+1]}")

        if arr[j] > arr[j + 1]:     # 如果左邊比較大,就交換
            arr[j], arr[j + 1] = arr[j + 1], arr[j] # Python的交換語法
            print(f"  交換 → {arr}")
        else:
            print("  不交換")

print(f"排序完成:{arr}")

上述程式碼會印出:

第 1 輪開始:[1, 3, 4, 2]
  比較 1 和 3
  不交換
  比較 3 和 4
  不交換
  比較 4 和 2
  交換 → [1, 3, 2, 4]
第 2 輪開始:[1, 3, 2, 4]
  比較 1 和 3
  不交換
  比較 3 和 2
  交換 → [1, 2, 3, 4]
第 3 輪開始:[1, 2, 3, 4]
  比較 1 和 2
  不交換
第 4 輪開始:[1, 2, 3, 4]
排序完成:[1, 2, 3, 4]

(其實到了第4輪就已經是排好的了,但程式還是會跑這一輪。)

另外很特別的是,很多程式語言在交換兩個變數時,需要使用一個臨時變數,
例如,a=5、b=3,想要做到a跟b交換,就要先創一個c,然後先讓c=a,a再=b,最後b=c;

但在Python是允許你在同一行就同時交換兩個變數的值:
a,b = b, a
燈愣!這樣一行就交換完了!

所以倒數第六行程式碼才會這樣寫 arr[j], arr[j + 1] = arr[j + 1], arr[j]

我覺得這個真的是方便又好記!


實務上幾乎沒人用泡泡排序來處理大量資料,因為很耗時。
不過,泡泡排序像是「演算法的幼稚園老師」——雖然它很慢,但它用簡單的動作教我們排序的核心思想。
就像學Python必練的九九乘法表——幫我們打下對理解雙層迴圈、條件判斷的基礎。


上一篇
D9 | Tkinter 學習心得:從入門到實作的小記錄
下一篇
D11 | 學習心得:Azure + LINE Bot打造雙向翻譯機
系列文
從零開始的AI學習之路:非本科轉職的30天挑戰記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言